package com.crungoo;

import com.crungoo.model.A;
import com.crungoo.model.User;
import com.crungoo.service.UserService;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotatedBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;

/**
 * @author fujc-dev@qq.com
 * @description TODO
 * @date 2023/6/22 15:14
 */

public class P1 {

	public static void main(String[] args) {
		// 使用无参构造函数启动Spring框架
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		// 需要手动执行刷新
		context.refresh();
		// 注入一个Bean，该Bean并没有被我们标记@Component
		// 创建一个BeanDefinitionReader
		AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(context);
		reader.register(User.class);
		User user = context.getBean(User.class);
		user.test();
		// 另外，还可以使用扫描.class文件的方式注入标记了@Component注解的Bean
		ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
		scanner.scan("com.crungoo.service");
		UserService userService = context.getBean(UserService.class);
		userService.test();

		AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
		beanDefinition.setBeanClass(A.class);
		context.registerBeanDefinition("a",beanDefinition);
		A a = context.getBean(A.class);
		a.test();
		// 分别演示了使用编程式的方式注入bean，以及包名扫描的注入
		// 其目的主要的演示创建Bean的方式很有很。因为源码里面也是基于这种方式实现BeanDefinition构建的。
	}
}
